#!/usr/bin/env python3
"""
为 work_order_fields 表添加字段类型标识的迁移脚本
用于区分基础字段和自定义字段
"""

import sqlite3
import os
import json
from datetime import datetime

def main():
    # 数据库文件路径
    db_path = '/home/gd/dispatch-system/backend/instance/dispatch_system.db'
    
    if not os.path.exists(db_path):
        print(f"数据库文件不存在: {db_path}")
        return
    
    try:
        # 连接数据库
        conn = sqlite3.connect(db_path)
        cursor = conn.cursor()
        
        # 检查是否已经存在 field_category 字段
        cursor.execute("PRAGMA table_info(work_order_fields)")
        columns = [column[1] for column in cursor.fetchall()]
        
        if 'field_category' in columns:
            print("field_category 字段已存在，跳过迁移")
            return
        
        print("开始为 work_order_fields 表添加 field_category 字段...")
        
        # 添加 field_category 字段
        # basic: 基础字段, custom: 自定义字段
        cursor.execute("""
            ALTER TABLE work_order_fields 
            ADD COLUMN field_category VARCHAR(20) DEFAULT 'custom'
        """)
        
        # 添加 is_visible 字段（用于基础字段的显示控制）
        cursor.execute("""
            ALTER TABLE work_order_fields 
            ADD COLUMN is_visible BOOLEAN DEFAULT TRUE
        """)
        
        # 添加 system_required 字段（用于标识系统必需的字段）
        cursor.execute("""
            ALTER TABLE work_order_fields 
            ADD COLUMN system_required BOOLEAN DEFAULT FALSE
        """)
        
        # 添加 description 字段（字段描述）
        cursor.execute("""
            ALTER TABLE work_order_fields 
            ADD COLUMN description TEXT
        """)
        
        print("字段添加完成，开始插入基础字段配置...")
        
        # 定义基础字段配置
        basic_fields = [
            {
                'name': 'order_number',
                'label': '工单编号',
                'field_type': 'text',
                'is_required': True,
                'system_required': True,
                'is_visible': True,
                'description': '系统自动生成的唯一工单编号',
                'sort_order': 1,
                'field_category': 'basic'
            },
            {
                'name': 'title',
                'label': '工单标题',
                'field_type': 'text',
                'is_required': False,
                'system_required': False,
                'is_visible': True,
                'description': '工单的简要标题描述',
                'sort_order': 2,
                'field_category': 'basic'
            },
            {
                'name': 'description',
                'label': '工单描述',
                'field_type': 'textarea',
                'is_required': False,
                'system_required': False,
                'is_visible': True,
                'description': '工单的详细描述信息',
                'sort_order': 3,
                'field_category': 'basic'
            },
            {
                'name': 'type',
                'label': '工单类型',
                'field_type': 'select',
                'options': json.dumps(['maintenance', 'cleaning', 'safety', 'other']),
                'is_required': True,
                'system_required': True,
                'is_visible': True,
                'description': '工单的类型分类',
                'sort_order': 4,
                'field_category': 'basic'
            },
            {
                'name': 'priority',
                'label': '优先级',
                'field_type': 'select',
                'options': json.dumps(['low', 'medium', 'high', 'urgent']),
                'is_required': True,
                'system_required': True,
                'is_visible': True,
                'description': '工单的优先级别',
                'sort_order': 5,
                'field_category': 'basic'
            },
            {
                'name': 'status',
                'label': '工单状态',
                'field_type': 'select',
                'options': json.dumps(['pending', 'assigned', 'in_progress', 'completed', 'cancelled']),
                'is_required': True,
                'system_required': True,
                'is_visible': True,
                'description': '工单的当前状态',
                'sort_order': 6,
                'field_category': 'basic'
            },
            {
                'name': 'location',
                'label': '位置信息',
                'field_type': 'text',
                'is_required': False,
                'system_required': False,
                'is_visible': True,
                'description': '工单相关的位置信息',
                'sort_order': 7,
                'field_category': 'basic'
            },
            {
                'name': 'assignee_id',
                'label': '分配人员',
                'field_type': 'select',
                'is_required': False,
                'system_required': False,
                'is_visible': True,
                'description': '负责处理此工单的人员',
                'sort_order': 8,
                'field_category': 'basic'
            },
            {
                'name': 'area_id',
                'label': '所属区域',
                'field_type': 'select',
                'is_required': False,
                'system_required': False,
                'is_visible': True,
                'description': '工单所属的区域',
                'sort_order': 9,
                'field_category': 'basic'
            },
            {
                'name': 'scheduled_start',
                'label': '计划开始时间',
                'field_type': 'datetime',
                'is_required': False,
                'system_required': False,
                'is_visible': True,
                'description': '计划开始处理工单的时间',
                'sort_order': 10,
                'field_category': 'basic'
            },
            {
                'name': 'scheduled_end',
                'label': '计划结束时间',
                'field_type': 'datetime',
                'is_required': False,
                'system_required': False,
                'is_visible': True,
                'description': '计划完成工单的时间',
                'sort_order': 11,
                'field_category': 'basic'
            },
            {
                'name': 'notes',
                'label': '备注信息',
                'field_type': 'textarea',
                'is_required': False,
                'system_required': False,
                'is_visible': True,
                'description': '工单的备注信息',
                'sort_order': 12,
                'field_category': 'basic'
            }
        ]
        
        # 插入基础字段配置
        for field in basic_fields:
            # 检查字段是否已存在
            cursor.execute("SELECT id FROM work_order_fields WHERE name = ?", (field['name'],))
            if cursor.fetchone():
                print(f"基础字段 {field['name']} 已存在，跳过插入")
                continue
            
            cursor.execute("""
                INSERT INTO work_order_fields (
                    name, label, field_type, options, is_required, 
                    is_visible, system_required, description, sort_order, 
                    field_category, is_active, created_at
                ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
            """, (
                field['name'],
                field['label'],
                field['field_type'],
                field.get('options'),
                field['is_required'],
                field['is_visible'],
                field['system_required'],
                field['description'],
                field['sort_order'],
                field['field_category'],
                True,  # is_active
                datetime.utcnow().isoformat()
            ))
            
            print(f"已插入基础字段: {field['name']} - {field['label']}")
        
        # 提交更改
        conn.commit()
        print("迁移完成！")
        print("\n新增字段说明:")
        print("- field_category: 字段类别 (basic=基础字段, custom=自定义字段)")
        print("- is_visible: 是否显示 (用于基础字段的显示控制)")
        print("- system_required: 系统必需 (标识系统必需的字段)")
        print("- description: 字段描述")
        
    except sqlite3.Error as e:
        print(f"数据库操作失败: {e}")
        if conn:
            conn.rollback()
    except Exception as e:
        print(f"迁移失败: {e}")
        if conn:
            conn.rollback()
    finally:
        if conn:
            conn.close()

if __name__ == '__main__':
    main()